package com.zhiche.lisa.bms.service.prepay;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.zhiche.lisa.bms.dao.model.contract.Contract;
import com.zhiche.lisa.bms.dao.model.fee.FeePayable;
import com.zhiche.lisa.bms.dao.model.prepay.PrepayBill;
import com.zhiche.lisa.bms.pojo.vo.prepay.PrepayBillPertrolVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 预付账单 服务类
 * </p>
 *
 * @author zhangkun
 * @since 2018-09-20
 */
public interface PrepayBillService extends IService<PrepayBill> {

    /**
     * 分页查询
     *
     * @param page
     * @return
     */
    Page<PrepayBill> queryPrepayBillPage(Page<PrepayBill> page);

    /**
     * 根据条件获取所有匹配数据
     *
     * @param condition
     * @return
     */
    List<PrepayBill> queryPrepayBillList(Map<String, Object> condition);

    /**
     * 获取指定数据列
     *
     * @param appointProperty
     * @param val
     * @return
     */
    List<Object> selectPrepayBillAppoint(String appointProperty, String val);

    /**
     * 生成预付账单
     *
     * @param feePayable
     * @param contract
     */
    void insertPrepayBill(FeePayable feePayable, Contract contract);

    /**
     * 根据应付账款生成默认预付帐单数据
     *
     * @param feePayable
     * @return
     */
    PrepayBill bindDefaultPrepayBillByFeePable(FeePayable feePayable);

    /**
     * 审核预付账单
     *
     * @param ids
     * @param prepayType 0-油卡, 1-现金
     */
    void checkPrepayBill(List<Long> ids, int prepayType);

    /**
     * 单个审核
     *
     * @param prepayBill
     */
    void checkPrepayBill(PrepayBill prepayBill);

    /**
     * 确认预付账单
     *
     * @param ids
     * @param bankSerialNum
     */
    void confirmPrepayBill(List<Long> ids, String bankSerialNum);

    /**
     * 更新预付账单
     *
     * @param ids
     */
    void updatePrepayBill(List<Long> ids);

    /**
     * 根据账单ID，查询预付账单
     *
     * @param headIds
     * @return
     */
    List<PrepayBill> queryPayApplyList(List<Long> headIds);

    /**
     * 根据账单ID，查询已确认预付账单
     *
     * @param headIds
     * @return
     */
    List<PrepayBill> queryPayApplyAreConfirmList(List<Long> headIds);

    /**
     * 根据支付申请ID，查询预付账单
     *
     * @param payId
     * @return
     */
    List<PrepayBill> getPayApplyByPayIDList(Long payId);

    /**
     * 根据油卡支付的考核状态对应修改预付帐单状态
     *
     * @param ids
     */
    void updateStateByFcPay(List<Long> ids);

    /**
     * 加油站第一桶油分页查询
     *
     * @param page
     * @return
     */
    Page<PrepayBillPertrolVO> queryPertrolOilPage(Page<PrepayBillPertrolVO> page);

    /**
     * 根据条件查询
     *
     * @param prepayBillPertrolVO
     * @return
     */
    PrepayBillPertrolVO getPertrolOilCondition(PrepayBillPertrolVO prepayBillPertrolVO);

    /**
     * 更新缺人加油状态
     *
     * @param prepayBill
     */
    void updatePertrolOilStatue(PrepayBill prepayBill);

    /**
     * 根据条件获取所有匹配数据
     *
     * @param condition
     * @return
     */
    List<PrepayBillPertrolVO> queryPertrolOilPrepayBillList(Map<String, Object> condition);

    /**
     * 根据油卡支付的考核状态对应修改预付帐单状态
     *
     * @param ids
     */
    void updatePertrolOilPrice(List<Long> ids);

    /**
     * 无登录用户查询
     *
     * @param ew
     * @return
     */
    List<PrepayBill> selectListNoTenant(@Param("ew") Wrapper<PrepayBill> ew);

    /**
     * 更新发运状态
     *
     * @param orderCode
     */
    void updateHuiyuncheLoadStatusByOrderCode(String orderCode);

    /**
     * 根据条件更新第一桶油价
     *
     * @param condition
     */
    void updateBatchPertrolOilPriceByCondition(Map<String, Object> condition);

    /**
     * 生成预付账单
     *
     * @param feePayable
     * @param contract
     */
    void createPrepayBillByContract(FeePayable feePayable, Contract contract);

    /**
     * 根据条件获取所有匹配数据-针对打印金额
     *
     * @param condition
     * @return
     */
    Map<String, Object> queryPrepayBillForPrint(Map<String, Object> condition);
}
